﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Web.Configuration;

namespace UricaoWeb.Datos.ConexionBD.Reservas
{
    public class DatosReservas
    {
        public DatosReservas()
        { }

        /// <summary>
        /// Función que realiza la conexión a base de dato
        /// y convierte el comando en un stored procedure 
        /// para poder ser accedido
        /// </summary>
        /// <param name="procedimiento"> Nombre del stored procedure </param>
        /// <param name="procedimiento"> Conexion abierta </param>
        /// <returns>
        /// Returna el comando de establecimiento de conexión según 
        /// el stored procedure requerido
        /// </returns>
        private SqlCommand ConsultarProcedimientoAlmacenado(string _procedimiento, SqlConnection _conexion)
        {
            SqlCommand _comando = new SqlCommand(_procedimiento, _conexion);
            _comando.CommandType = CommandType.StoredProcedure;
            return _comando;
        }


        /// <summary>
        /// Definición global de los procedimientos dentro de la BD 
        /// por medio de palabras claves
        /// </summary>
        /// <param name="_peticion">Palabra clave </param>
        /// <returns>Retorna en string, el nombre completo del procedimiento</returns>
        private string ProcedimientosDeLaBD(string _peticion)
        {
            string _procedimiento = null;
            switch (_peticion)
            {
                case "HabitacionLibre":
                    _procedimiento = "dbo.reservar_habitacionLibre";
                    break;
                case "ConsultarReservaTour":
                    _procedimiento = "dbo.reservar_ConsultarTour";
                    break;
                case "InsertarCliente":
                    _procedimiento = "dbo.reservar_InsertarCliente";
                    break;
                case "ConsultarReservaRoomService":
                    _procedimiento = "dbo.reservar_ConsultarRoomService";
                    break;
                case "ReservarHabitacion":
                    _procedimiento = "dbo.reservar_ReservarHabitacion";
                    break;
                case "ReservarTour":
                    _procedimiento = "dbo.reservar_ReservarTour";
                    break;
                case "ReservarMesa":
                    _procedimiento = "dbo.reservar_ReservarMesa";
                    break;
                case "ReservarHabAdicional":
                    _procedimiento = "dbo.reservar_ReservarHabAdicional";
                    break;
                case "ReservarRoomService":
                    _procedimiento = "dbo.reservar_ReservarRoomService";
                    break;
                case "ConsultarHorarioTour":
                    _procedimiento = "dbo.reservar_ConsultarHorarioTour";
                    break;
                case "ConsultarClienteReserva":
                    _procedimiento = "dbo.reservar_ConsultarClienteReserva";
                    break;
                case "ConsultarTourTodos":
                    _procedimiento = "dbo.ConsultarTourTodos";
                    break;
                case "ConsultarPorId":
                    _procedimiento = "dbo.ConsultarTourId";
                    break;
                case "ConsultarRestauranteTodos":
                    _procedimiento = "dbo.reservar_ConsultarRestauranteTodos";
                    break;
                case "ConsultarPlatoTodos":
                    _procedimiento = "dbo.reservar_ConsultarPlatoTodos";
                    break;
                case "ConsultarPlatosReservacion":
                    _procedimiento = "dbo.reservar_ConsultarPlatosReservacion";
                    break;
                case "ConsultarReservaHabitacion":
                    _procedimiento = "dbo.reservar_ConsultarHabitacion";
                    break;
                case "ConsultarReservaRestaurante":
                    _procedimiento = "dbo.reservar_ConsultarRestaurante";
                    break;
                case "ConsultarInformacionCliente":
                    _procedimiento = "dbo.reservar_ConsultarInformacionCliente";
                    break;
                case "MaxCodigoReservacion":
                    _procedimiento = "dbo.reservar_MaxCodigoReservacion";
                    break;
                default:
                    Console.WriteLine("Petición errónea");
                    break;
            }

            return _procedimiento;
        }


        /// <summary>
        /// Asignación del objeto de la BD a un objeto tipo Tour
        /// Se inicializan los parametros en estricto orden que arroja el query
        /// según las posiciones de cada columna especificacda en la consulta
        /// </summary>
        /// <param name="objeto">Objeto leído de la BD tipo SqlDataReader</param>
        /// <returns>Retorna el objeto Tour</returns>
        private Tour AsignarTourConBD(SqlDataReader _objeto)
        {
            Tour _tour = new Tour();
            try
            {
                _tour.IdTour = _objeto.GetInt32(0);
                _tour.DescripcionTour = _objeto.GetString(1);
                _tour.PrecioTour = (double)_objeto.GetSqlDouble(2);
                _tour.CapacidadTour = (int)_objeto.GetSqlInt16(3);
                _tour.NombreTour = _objeto.GetString(4);
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _tour;

        }


        /// <summary>
        /// Se agregan parametros al procedimiento 
        /// que se va a ejecutar
        /// </summary>
        /// <param name="c">comando</param>
        /// <param name="parametros">parametros al comando</param>
        private void AgregarParametrosAComando(SqlCommand _c, Dictionary<string, object> _parametros)
        {
            foreach (KeyValuePair<string, object> parametro in _parametros)
            {
                _c.Parameters.AddWithValue(parametro.Key, parametro.Value);
            }
        }



        /// <summary>
        /// Metodo para consultar todos los tours 
        /// </summary>
        /// <returns>
        /// Retorna una lista de tours
        /// Se utiliza para listar
        /// los tours en la ventana de Reservar Tour
        /// </returns>
        public List<Tour> ConsultarTours()
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ConsultarTourTodos";    //Palabra clave para consultar el procedimiento necesario
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            List<Tour> _listaTours = new List<Tour>();

            try
            {
                _operaciones._cn.Open();
                _lectura = _comando.ExecuteReader();

                while (_lectura.Read())
                {
                    Tour _tour = AsignarTourConBD(_lectura);
                    if (_tour != null)
                    {
                        _listaTours.Add(_tour);
                    }
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _listaTours;
        }

        /// <summary>
        /// Metodo para consultar todos los tours 
        /// </summary>
        /// <returns>
        /// Retorna una lista de tours
        /// </returns>
        public List<Tour> ConsultarTour(int _idTour)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ConsultarPorId";    //Palabra clave para consultar el procedimiento necesario
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            List<Tour> _listaTours = new List<Tour>();

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@id", _idTour);
                AgregarParametrosAComando(_comando, _parametros);

                _lectura = _comando.ExecuteReader();

                while (_lectura.Read())
                {
                    Tour _tour = AsignarTourConBD(_lectura);
                    if (_tour != null)
                    {
                        _listaTours.Add(_tour);
                    }
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _listaTours;
        }

        /// <summary>
        /// Asignación del objeto de la BD a un objeto tipo HorarioTour
        /// Se inicializan los parametros en estricto orden que arroja el query
        /// según las posiciones de cada columna especificacda en la consulta
        /// </summary>
        /// <param name="objeto">Objeto leído de la BD tipo SqlDataReader</param>
        /// <returns>Retorna el objeto Tour</returns>
        private HorarioTour AsignarHorarioTourConBD(SqlDataReader _objeto)
        {
            HorarioTour _horarioTour = new HorarioTour();
            try
            {
                _horarioTour.IdHorario = _objeto.GetInt32(0);
                _horarioTour.FechaInicioHorario = _objeto.GetDateTime(1).ToString();
                _horarioTour.FechaFinHorario = _objeto.GetDateTime(2).ToString();
                _horarioTour.FkTour = _objeto.GetInt32(3);
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _horarioTour;

        }

        /// <summary>
        /// Metodo para consultar todos los horario tours 
        /// </summary>
        /// <returns>
        /// Retorna una lista de horarios tours
        /// </returns>
        public List<HorarioTour> ConsultarHorarioTour(int _idTour)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ConsultarHorarioTour";    //Palabra clave para consultar el procedimiento necesario
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            List<HorarioTour> _listaHorario = new List<HorarioTour>();

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@id", _idTour);
                AgregarParametrosAComando(_comando, _parametros);

                _lectura = _comando.ExecuteReader();

                while (_lectura.Read())
                {
                    HorarioTour horarioTour = AsignarHorarioTourConBD(_lectura);
                    if (horarioTour != null)
                    {
                        _listaHorario.Add(horarioTour);
                    }
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _listaHorario;
        }


        /// <summary>
        /// Metodo para consultar todos los clientes
        /// que hacen reservaciones
        /// </summary>
        /// <returns>
        /// Retorna una lista de clientes
        /// </returns>
        public List<String> ConsultarClienteReserva(int _idCodigoReserva, int _idHotel)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ConsultarClienteReserva";    //Palabra clave para consultar el procedimiento necesario
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            List<String> _listaInfoCliente = new List<String>();

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@idCodigoReservacion", _idCodigoReserva);
                _parametros.Add("@idHotel", 1);
                AgregarParametrosAComando(_comando, _parametros);

                _lectura = _comando.ExecuteReader();

                while (_lectura.Read())
                {
                    /*
                        listaInfoCliente.Add("1212");
                        listaInfoCliente.Add("jeje");
                    */
                    //listaInfoCliente.Add(lectura.GetInt32(0).ToString());
                    _listaInfoCliente.Add(_lectura.GetInt32(0).ToString());
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _listaInfoCliente;
        }

        /// <summary>
        /// Metodo para consultar el Room Service de una Reservacion
        /// </summary>
        /// <returns>
        /// Retorna un string de informacion
        /// </returns>
        public string ConsultarReservaRoomService(int _idCodigoReserva)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ConsultarReservaRoomService";
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            string _infoRoomService = null;

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@codigoReservacion", _idCodigoReserva);
                _parametros.Add("@idHotel", 1);
                AgregarParametrosAComando(_comando, _parametros);

                _lectura = _comando.ExecuteReader();

                if (_lectura.Read())
                {
                    _infoRoomService += "-Hora: " + _lectura.GetString(0) + " -Plato: " + _lectura.GetString(1);
                }

                while (_lectura.Read())
                {
                    _infoRoomService += " -Plato: " + _lectura.GetString(1);
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _infoRoomService;
        }


        /// <summary>
        /// Asignación del objeto de la BD a un objeto tipo Restaurante
        /// según las posiciones de cada columna especificacda en la consulta
        /// </summary>
        /// <param name="objeto">Objeto leído de la BD tipo SqlDataReader</param>
        /// <returns>Retorna el objeto Restaurante</returns>
        private Restaurante AsignarRestauranteConBD(SqlDataReader _objeto)
        {
            Restaurante _restaurante = new Restaurante();
            try
            {
                _restaurante.IdRestaurante = _objeto.GetInt32(0);
                _restaurante.NombreRestaurante = _objeto.GetString(1);
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _restaurante;

        }


        /// <summary>
        /// Metodo para consultar todos los restaurantes 
        /// </summary>
        /// <returns>
        /// Retorna una lista de restaurantes
        /// </returns>
        public List<Restaurante> ConsultarRestaurantes()
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ConsultarRestauranteTodos";    //Palabra clave para consultar el procedimiento necesario
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            List<Restaurante> _listaRestaurantes = new List<Restaurante>();

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@idHotel", 1);
                AgregarParametrosAComando(_comando, _parametros);
                _lectura = _comando.ExecuteReader();

                while (_lectura.Read())
                {
                    Restaurante _restaurante = AsignarRestauranteConBD(_lectura);
                    if (_restaurante != null)
                    {
                        _listaRestaurantes.Add(_restaurante);
                    }
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _listaRestaurantes;
        }

        /// <summary>
        /// Asignación del objeto de la BD a un objeto tipo Plato
        /// según las posiciones de cada columna especificacda en la consulta
        /// </summary>
        /// <param name="objeto">Objeto leído de la BD tipo SqlDataReader</param>
        /// <returns>Retorna el objeto Plato</returns>
        private Plato AsignarPlatoConBD(SqlDataReader _objeto)
        {
            Plato _plato = new Plato();
            try
            {
                _plato.IdPlato = _objeto.GetInt32(0);
                _plato.NombrePlato = _objeto.GetString(1);
                _plato.PrecioPlato = (float)_objeto.GetSqlDouble(2);
                _plato.DetallePlato = _objeto.GetString(1);

            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _plato;

        }


        /// <summary>
        /// Metodo para consultar todos los platos
        /// </summary>
        /// <returns>
        /// Retorna una lista de platos
        /// Utilizado para el Room Service
        /// </returns>
        public List<Plato> ConsultarPlatos()
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ConsultarPlatoTodos";    //Palabra clave para consultar el procedimiento necesario
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            List<Plato> _listaPlatos = new List<Plato>();

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> parametros = new Dictionary<string, object>();
                parametros.Add("@idHotel", 1);
                AgregarParametrosAComando(_comando, parametros);

                _lectura = _comando.ExecuteReader();

                while (_lectura.Read())
                {
                    Plato plato = AsignarPlatoConBD(_lectura);
                    if (plato != null)
                    {
                        _listaPlatos.Add(plato);
                    }
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _listaPlatos;
        }


        /// <summary>
        /// Metodo para consultar todos los platos de una reservacion
        /// </summary>
        /// <returns>
        /// Retorna una lista de platos
        /// Utilizado para el Room Service
        /// </returns>
        public List<Plato> ConsultarPlatosReservacion(int _codigoReservacion)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ConsultarPlatosReservacion";    //Palabra clave para consultar el procedimiento necesario
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            List<Plato> _listaPlatos = new List<Plato>();

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> parametros = new Dictionary<string, object>();
                parametros.Add("@idHotel", 1);
                parametros.Add("@idCodigoReservacion", _codigoReservacion);
                AgregarParametrosAComando(_comando, parametros);

                _lectura = _comando.ExecuteReader();

                while (_lectura.Read())
                {
                    Plato plato = AsignarPlatoConBD(_lectura);
                    if (plato != null)
                    {
                        _listaPlatos.Add(plato);
                    }
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _listaPlatos;
        }


        /// <summary>
        /// Metodo para consultar todos la Reserva de Habitacion
        /// </summary>
        /// <returns>
        /// Retorna toda la informacion relevante de la habitacion
        /// </returns>
        public string ConsultarReservaHabitacion(int _idCodigoReserva)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ConsultarReservaHabitacion";    //Palabra clave para consultar el procedimiento necesario
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            string _habitacion = null;

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@codigoReservacion", _idCodigoReserva);
                //_parametros.Add("@idHotel", 1);
                AgregarParametrosAComando(_comando, _parametros);

                _lectura = _comando.ExecuteReader();

                while (_lectura.Read())
                {
                    _habitacion += "--Nro Habitacion: " + _lectura.GetInt16(0) + " -Tipo: " + _lectura.GetString(1)
                                + " -Precio: " + _lectura.GetSqlDouble(2).ToString() + " -Descripcion: " + _lectura.GetString(3)
                                + " -Nro de Adultos: " + _lectura.GetInt16(4) + " -Nro de Ninos: " + _lectura.GetInt16(5)
                                + " -Fecha de Entrada: " + _lectura.GetDateTime(6).ToString() + " -Fecha de Salida: " + _lectura.GetDateTime(7).ToString();
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _habitacion.ToString();
        }

        /// <summary>
        /// Metodo para consultar toda la Reserva de Restaurante
        /// </summary>
        /// <returns>
        /// Retorna toda la informacion relevante de la mesa
        /// </returns>
        public string ConsultarReservaRestaurante(int _idCodigoReserva)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ConsultarReservaRestaurante";    //Palabra clave para consultar el procedimiento necesario
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            string _restaurante = null;

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@codigoReservacion", _idCodigoReserva);
                // parametros.Add("@idHotel", idHotel);
                AgregarParametrosAComando(_comando, _parametros);

                _lectura = _comando.ExecuteReader();

                while (_lectura.Read())
                {
                    _restaurante += "-Nombre: " + _lectura.GetString(0) + " -Tipo: " + _lectura.GetString(1)
                    + " -Fecha de Reservacion: " + _lectura.GetDateTime(2).ToString() + " -Nro de Personas: " + _lectura.GetInt16(3) + " ";
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _restaurante;
        }

        /// <summary>
        /// Metodo para consultar la Reserva de Tour de un cliente
        /// </summary>
        /// <returns>
        /// Retorna toda la informacion relevante del Tour
        /// </returns>
        public string ConsultarReservaTour(int _idCodigoReserva)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ConsultarReservaTour";    //Palabra clave para consultar el procedimiento necesario
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            string _tour = null;

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@codigoReservacion", _idCodigoReserva);
                // parametros.Add("@idHotel", idHotel);
                AgregarParametrosAComando(_comando, _parametros);

                _lectura = _comando.ExecuteReader();

                while (_lectura.Read())
                {
                    _tour += "-Nombre: " + _lectura.GetString(0) + " -Precio por Persona: " + _lectura.GetSqlDouble(1).ToString()
                    + " -Fecha del Tour: " + _lectura.GetDateTime(3).ToString()
                    + " -Nro de Personas: " + _lectura.GetInt16(4);
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _tour;
        }

        /// <summary>
        /// Metodo para consultar el Room Service de una Reservacion
        /// </summary>
        /// <returns>
        /// Retorna un string de informacion
        /// </returns>
        public string ConsultarInformacionCliente(int _idCodigoReserva)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ConsultarInformacionCliente";
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            string _infoCliente = null;

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@codigoReservacion", _idCodigoReserva);
                //_parametros.Add("@idHotel", 1);
                AgregarParametrosAComando(_comando, _parametros);

                _lectura = _comando.ExecuteReader();

                while (_lectura.Read())
                {
                    _infoCliente = _lectura.GetString(0) + " " + _lectura.GetString(1) + " Documento: " + _lectura.GetString(2);
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _infoCliente;
        }

        /// <summary>
        /// Creacion de una Reserva Tour
        /// </summary>
        /// <param name="_idCodigoReservacion">Codigo de la Reserva</param>
        /// <param name="_idTour"> Id del Tour a Reservar</param>
        /// <param name="_personasReserva">Cliente que va a reservar</param>
        /// <returns>Retorna True si se ha realizado la transacción completa</returns>
        public bool ReservarTour(int _idCodigoReservacion, int _idTour, int _personasReserva)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ReservarTour";    //Palabra clave para consultar el procedimiento necesario
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@idCodigoReservacion", _idCodigoReservacion);
                _parametros.Add("@idTour", _idTour);
                _parametros.Add("@personasReserva", _personasReserva);
                AgregarParametrosAComando(_comando, _parametros);

                int _insertar = _comando.ExecuteNonQuery();

                if (_insertar > 0)
                {
                    return true;
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }
            finally { _operaciones._cn.Close(); }

            return false;
        }

        /// <summary>
        /// Creacion de una Reserva de Mesa
        /// </summary>
        /// <param name="_idCodigoReservacion">Codigo de la Reserva</param>
        /// <param name="_idRestaurante"> Id del Restaurante a Reservar</param>
        /// <param name="_cantidadPersonas">Cantidad de personas en la mesa a reservar</param>
        /// <param name="_fecha">Fecha de Reserva</param>
        /// <returns>Retorna True si se ha realizado la transacción completa</returns>
        public bool ReservarMesa(int _idCodigoReservacion, int _idRestaurante, int _cantidadPersonas, string _fecha)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ReservarMesa";    //Palabra clave para consultar el procedimiento necesario
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@codigoReservacion", _idCodigoReservacion);
                _parametros.Add("@idRestaurante", _idRestaurante);
                _parametros.Add("@cantidadPersonas", _cantidadPersonas);
                _parametros.Add("@fecha", _fecha);
                AgregarParametrosAComando(_comando, _parametros);

                int _insertar = _comando.ExecuteNonQuery();

                if (_insertar > 0)
                {
                    return true;
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }
            finally { _operaciones._cn.Close(); }

            return false;
        }

        /// <summary>
        /// Creacion de un Room Service
        /// </summary>
        /// <param name="_idCodigoReservacion">Codigo de la Reserva</param>
        /// <param name="_fkPlato"> Id del plato a ordenar</param>
        /// <returns>Retorna True si se ha realizado la transacción completa</returns>
        public bool ReservarRoomService(int _CodigoReservacion, int _fkPlato)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ReservarRoomService";
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@idCodigoReservacion", _CodigoReservacion);
                _parametros.Add("@fkPlato", _fkPlato);


                AgregarParametrosAComando(_comando, _parametros);

                int _insertar = _comando.ExecuteNonQuery();

                if (_insertar > 0)
                {

                    return true;
                }
            }

            catch (Exception e) { throw new Exception("Falla", e); }
            finally { _operaciones._cn.Close(); }

            return false;
        }

        /// <summary>
        /// Creacion de un Reservar Habitacion
        /// </summary>
        /// <param name="_tipoHabitacion">Tipo de habitacion(simple,familiar)</param>
        /// <param name="_adulto"> Numero de adultos</param>
        /// <param name="_nino"> Numero de ninos</param>
        /// <param name="_fechaInicio">Fecha que inica la reserva</param>
        /// <param name="_fechaFin"> Fecha que finaliza la reserva</param>
        /// <returns>Retorna True si se ha realizado la transacción completa</returns>
        public bool ReservarHabitacion(string _tipoHabitacion, int _adulto, int _nino, string _fechaInicio, string _fechaFin)
        {
            /*
            OperacionesBD _operacionesHl = new OperacionesBD();

            string _procedimientoHl = ProcedimientosDeLaBD("HabitacionLibre");
            SqlCommand _comandoHl = ConsultarProcedimientoAlmacenado(_procedimientoHl, _operacionesHl._cn);
            SqlDataReader _lecturaHl;

            try
            {
                _operacionesHl._cn.Open();
                Dictionary<string, object> _parametrosHl = new Dictionary<string, object>();
                _parametrosHl.Add("@tipoHabitacion", _tipoHabitacion);
                _parametrosHl.Add("@fechaInicio", _fechaInicio);
                _parametrosHl.Add("@fechaFin", _fechaFin);

                AgregarParametrosAComando(_comandoHl, _parametrosHl);

                _lecturaHl = _comandoHl.ExecuteReader();

                if (_lecturaHl.Read())
                {
                    if (_lecturaHl.GetString(0) == null)
                    {
                        return false;
                    }
                }

            }
            catch (Exception e) { throw new Exception("Falla", e); }
            finally { _operacionesHl._cn.Close(); }
            */
            ///////
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ReservarHabitacion";
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@tipoHabitacion", _tipoHabitacion);
                _parametros.Add("@adulto", _adulto);
                _parametros.Add("@nino", _nino);
                _parametros.Add("@fechaInicio", _fechaInicio);
                _parametros.Add("@fechaFin", _fechaFin);

                AgregarParametrosAComando(_comando, _parametros);

                int _insertar = _comando.ExecuteNonQuery();

                if (_insertar > 0)
                {

                    return true;
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }
            finally { _operaciones._cn.Close(); }

            return false;
        }

        /// <summary>
        /// Creacion de un cliente para la reserva
        /// </summary>
        /// <param name="_nombre"> Nombre del cliente</param>
        /// <param name="_apellido"> Apellido del cliente</param>
        /// <param name="_documento"> Numero de Documento</param>
        /// <param name="_tipoDoc"> Tipo de documento</param>
        /// <param name="_tipoPago"> Tipo de pago</param>
        /// <param name="_correo"> Correo del cliente</param>
        /// <returns>Retorna True si se ha realizado la transacción completa</returns>
        public bool InsertarCliente(string _nombre, string _apellido, string _documento, string _tipoDoc, string _tipoPago, string _correo)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "InsertarCliente";
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@nombreCliente", _nombre);
                _parametros.Add("@apellidoCliente", _apellido);
                _parametros.Add("@documentoCliente", _documento);
                _parametros.Add("@tarjetaCliente", _tipoPago);
                _parametros.Add("@tipoDocCliente", _tipoDoc);
                _parametros.Add("@correoCliente", _correo);

                AgregarParametrosAComando(_comando, _parametros);

                int _insertar = _comando.ExecuteNonQuery();

                if (_insertar > 0)
                {

                    return true;
                }
            }

            catch (Exception e) { throw new Exception("Falla", e); }
            finally { _operaciones._cn.Close(); }

            return false;
        }

        /// <summary>
        /// Codigo de reserva de un cliente
        /// </summary>
        /// <param name="_nombre"> Nombre del cliente</param>
        /// <returns>Codigo de Reserva del cliente</returns>
        public string MaxCodigoReservacion()
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "MaxCodigoReservacion";
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            SqlDataReader _lectura;
            string _codigo = null;

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@id", 1);
                //_parametros.Add("@idHotel", 1);
                AgregarParametrosAComando(_comando, _parametros);

                _lectura = _comando.ExecuteReader();

                while (_lectura.Read())
                {
                    _codigo = _lectura.GetString(0);
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }

            return _codigo;
        }

        /// <summary>
        /// Creacion de un Reservar Habitacion
        /// </summary>
        /// <param name="_tipoHabitacion">Tipo de habitacion(simple,familiar)</param>
        /// <param name="_adulto"> Numero de adultos</param>
        /// <param name="_nino"> Numero de ninos</param>
        /// <returns>Retorna True si se ha realizado la transacción completa</returns>
        public bool ReservarHabAdicional(int _codigoReservacion, string _tipoHabitacion, int _adulto, int _nino)
        {
            OperacionesBD _operaciones = new OperacionesBD();

            string _accion = "ReservarHabAdicional";
            string _procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand _comando = ConsultarProcedimientoAlmacenado(_procedimiento, _operaciones._cn);

            try
            {
                _operaciones._cn.Open();
                Dictionary<string, object> _parametros = new Dictionary<string, object>();
                _parametros.Add("@idCodigoReservacion", _codigoReservacion);
                _parametros.Add("@tipoHabitacion", _tipoHabitacion);
                _parametros.Add("@adulto", _adulto);
                _parametros.Add("@nino", _nino);

                AgregarParametrosAComando(_comando, _parametros);

                int _insertar = _comando.ExecuteNonQuery();

                if (_insertar > 0)
                {

                    return true;
                }
            }
            catch (Exception e) { throw new Exception("Falla", e); }
            finally { _operaciones._cn.Close(); }

            return false;
        }


    }
}